|
Date : 7 ET 8 NOVEMBRE 1991 Protection : MOT DE PASSE Programme : GREAT COURTS II Outils : SOFT-ICE V2.50 Fichier : VGA.DAT + GC2FS.COM Temps pass� : 1 HEURE 30 Soci�t� : UBI SOFT Divers : O� je me fais avoir en beaut�. Origine : ? Num�ro : 148 Une demande de mot de passe qui est constamment renouvel�e tant que l'on n'a pas entr� les quatre bons caract�res. �a peut durer longtemps. Les caract�res sont demand�s par l'interm�diaire de l'INT 16 sous- fonction 00. En bricolant un peu par ci par l� on trouve un RET que le soft ignore superbement s'acharnant � vouloir passer ailleurs. Je le force ( premier patch ) ce qui me fait tomber sur quelque chose de connu, une position m�moire que l'on remet � z�ro dans un cas et pas dans l'autre: ( c'est du flair c'est tout ) CS=0FF5 CS:4933 E86100 CALL 4997 CS:4936 0BC0 OR AX,AX CS:4938 7807 JS 4941 ; SAUTE SI MAUVAISE REPONSE. CS:493A C70619250000 MOV WORD PTR [2519],0000 CS:4940 C3 RET En pla�ant deux NOP � la place du JS 4941 le jeu tourne. ( de plus aucun fichier n'est crypt� et l'on trouve toutes ces cha�nes dans le fichier VGA.DAT ). Voil� me direz-vous il ne suffit plus que de faire un patch pour le premier saut rencontrer au d�but. Et c'est l� que cela se corse car en modifiant le saut en question le jeu se trouve �tre pris de folie en clignotant d'un menu � l'autre ! Le saut en question suit une instruction TEST de la position 2B6D avec FF. Comme j'ai toujours z�ro en 2B6D mon JNZ qui suit s'ex�cute mal. ( c'est le moins que l'on puisse dire ). De plus je m'aper�ois avec SOFT-ICE que je repasse par ce saut plus tard une fois la demande du code pass�e ce qui explique que mon programme ne se d�roule plus correctement. Ci-dessous la routine en question: CS=0FF5 CS:6674 E83C09 CALL 6FB3 CS:6677 F6066D2BFFF TEST BYTE PTR [2B6D],FF CS:667C 752A JNZ 66A8 ; SAUT FATIDIQUE.... ACTIONS ET RESULTATS: INVERSION DU SAUT JNZ 66A8 EN JZ 66A8.............. --> JEU SE PLANTE. INVERSION DU FLAG Z................................ --> IDEM. ECRITURE D'UNE VALEUR DIFFERENTE DE ZERO EN [2B6D]. --> CA MARCHE. REMPLACER L'INSTRUCTION TEST PAR < MOV [2B6D],FF >. --> CA PLANTE. L'id�e vient d'essayer de trouver � quel moment le programme �crit 00 en [2B6D] et de modifier l'instruction. ( �a c'est g�nial ) Premi�re constatation : le programme de test du code n'�crit JAMAIS dans cette position ! Donc - restons calme - c'est que cette position est initialis�e au chargement du jeu, cela signifie ( avec un peu de chance ) que SOFT- ICE devrait me trouver l'instruction ( ou la boucle ) qui �crit � cet endroit. Un point d'arr�t du type < BPMB 1E69:2B6D W > est pos�. Pourquoi 1E69 ? Parceque DS est �gal � cette valeur au moment de l'appel tout simplement. Je relance tout et SOFT-ICE s'affiche imm�diatement. Je me trouve dans une boucle qui me remet toute la zone m�moire autour de 2B6D � z�ro � l'aide d'une instruction INSW. Las, cela ne figure donc pas dans le fichier, c'aurait �t� trop simple. INSW avez-vous dit ? Dans ce cas rien est perdu car c'est une instruction 80286/80386. Cela signifie que je me trouve dans le BIOS et que le programme n'est pas encore charg�. Car il faut savoir que les auteurs de logiciel sont obliger de programmer en utilisant le jeu d'instructions du PC XT autrement dit du 8088 pour que le jeu tourne sur toute les machines. ( compatibilit� ascendante ) Je relance donc SOFT-ICE par x et cette fois ci je m'arr�te dans mon programme avec une superbe instruction MOV BYTE PTR [2B6D],00. Je m'empresse de la transformer en MOV BYTE PTR [2B6D],01 et je relance mon soft... qui se plante toujours ! Avec SOFT-ICE je contr�le le contenu de la position 2B6D qui est �gale � ZERO ! Que signifie-ce ? Je place des points d'arr�ts partout pour pouvoir suivre le contenu de 2B6D et je m'aper�ois que le programme au niveau de la demande du code r��crit ZERO dans cette position: c'est � devenir fou. J'en ai marre: j'applique la soluce muscl�e c.a.d. d�tournement d'INT par un programme p�re. Le d�tournement d'INT en TSR me pose trop de probl�mes. Un point d'arr�t sur l'INT 16 sous-fonction 00 est plac� pour s'assurer que cette interruption n'est appel�e qu'� l'endroit de la demande du code et nul part ailleurs. Et on modifie un de mes pr�c�dents PATCH.ASM: ; PATCH POUR LE PROGRAMME GREAT COURTS II. ; DETOURNEMENT DE L'INT 16 SOUS-FONCTION 00. ; Il s'agit juste de mettre quelque chose dans la position m�moire 2B6D. ; 8 NOVEMBRE 1991. adr_ip equ 2b6dh seg_a segment byte public assume cs:seg_a, ds:seg_a, es:seg_a, ss:seg_a org 100h sto proc far start: jmp init ; r�duire la m�moire et d�placer la db 90h ; pile plus pr�s. nom_prg db 'gc2.exe',0,0,0,0,0,0 ; 12 car max + nul paramet dw 0 ; M�me bloc d'environnement. ENVIR dw 0 ; Les param�tres de la ligne de data_3 dw 0 ; commande sont recopi�s ici puis FCB_1 dw 0 ; transmis au programme fils. ( 80h ) data_5 dw 0 ; "LOAD /U EGA 1" FCB_2 dw 0 data_7 dw 0 sauve_SP dw 0 sauve_SS dw 0 data_9 dw 0, 0 drap equ 0 ;------------------------------ PROGRAMME PERE ------------------------------ loc_1: mov sauve_SP,sp mov sauve_SS,ss mov ax,80h mov ENVIR,ax ; Ligne de commande... mov data_3,ds mov ax,5Ch ; Premier FCB ( inutilis� ) mov FCB_1,ax mov data_5,ds mov ax,6Ch ; Second FCB ( inutilis� ) mov FCB_2,ax mov data_7,ds mov ah,35h mov al,16h int 21h ; DOS Services ah=function 35h ; get intrpt vector al in es:bx mov cs:data_9,bx mov word ptr cs:data_9+2,es mov ah,25h mov al,16h lea dx,cs:[int16] ; Load effective addr int 21h ; DOS Services ah=function 25h ; set intrpt vector al to ds:dx lea dx,cs:[nom_prg] ; Load effective addr push ds pop es lea bx,cs:[paramet] ; Load effective addr mov al,0 mov ah,4Bh int 21h ; Appel du programme fils. ; run progm @ds:dx, parm @es:bx mov sp,sauve_SP mov ss,sauve_SS mov ah,25h mov al,16h mov dx,cs:data_9 mov ds,word ptr cs:data_9+2 int 21h ; set intrpt vector al to ds:dx mov ah,4dh int 21h mov ah,4Ch int 21h ; terminate with al=return code sto endp ;---------------------------- int 16 d�tourn�e ----------------------------- int_16h_entry proc far int16: push ax push ds push bp push cx pushf cmp byte ptr ds:[drap],1 ; Je regarde si c'est fait. jz loc_2 cmp ah,0 ; Sous- fonction 00 jne loc_2 ; Jump if not equal mov byte ptr ds:[adr_ip],1 ; on place '1' dans DS:2B6D mov byte ptr ds:[drap],1 ; On y revient plus. loc_2: popf pop cx pop bp pop ds pop ax jmp dword ptr cs:data_9 int_16h_entry endp ;------------ REDUCTION DE LA PLACE OCCUPEE PAR LE PROGRAMME COM ------------ init: mov ah,4ah mov bx,offset fin ; Fin du programme en BX. mov cl,4 ; Divis� par 4 pour avoir des paragraphes. shr bx,cl inc bx ; On en rajoute un par s�curit�. int 21h ; Execution de la fonction 4Ah. mov sp,offset fin ; on d�place la pile en "fin" car elle est jmp loc_1 ; plac�e en FFFE dans un programme COM. fin_init label near ;----------------------- PLACE RESERVEE POUR LA PILE ------------------------ dw (256-((fin_init-init) shr 1)) dup (?) fin equ this byte ; ici le sommet de la pile, SP db 35 dup (?) db 'Please no more codewheel nor password, why bother ?' db 125 dup (?) db 'FREDDY_SOFT' seg_a ends end start 17 Novembre 1991 Ou je m'aper�ois en lan�ant le soft sans la routine de d�tournement que l'on peut passer le code simplement en tapant ESC ! Mais la seconde modification est obligatoire: avec PCTOOLS chercher 0BC07807 et modifier 7807 par 9090. 30 septembre 1992 O� pr�s d'un an apr�s pensant avoir perdu ce DEP je le recraque pour d�couvrir des choses que je n'avais pas vu la premi�re fois. Et comble de tout je n'avais pas perdu ce DEP c'est CGII.DEP que j'ai du �cras� et non celui-ci: GCII.DEP ! Me faisant toujours pi�ger par le fait que j'oublie que c'est la touche ESC qui fait sortir de la routine de test, je d�cortique tout en d�cidant de suivre le chemin par o� l'on fait passer les caract�res tap�s � l'�cran. Ayant trouv� l'endroit o� ils sont stock�s j'y place un point d'arr�t en lecture ( car il va bien falloir venir les relire pour les comparer � la bonne r�ponse ) et je lance la machine. BMPB 33D4:0075 R SOFT-ICE r�apparait imm�diatement avec la s�quence suivante: CS=0E02 CS:49DB 800441 ADD BYTE PTR [SI],41 CS:49DE A6 CMPSB CS:49DF 750A JNZ 49EB ; SI MAUVAIS ON SAUTE ET FFFF -> AX. CS:49E1 E2F8 LOOP 49DB ; TANT QUE C'EST BON ON TOURNE. CS:49E3 B80000 MOV AX,0000 ; SI OK 0000 -> AX. CS:49E6 07 POP ES CS:49E7 1F POP DS CS:49E8 5F POP DI CS:49E9 5E POP SI CS:49EA C3 RET ; ON S'EN VA AVEC LA BONNE REPONSE. CS:49EB B8FFFF MOV AX,FFFF ; MAUVAISE REPONSE. CS:49EE 07 POP ES CS:49EF 1F POP DS CS:49F0 5F POP DI CS:49F1 5E POP SI CS:49F2 C3 RET ; RETOUR AVEC LA MAUVAISE REPONSE. Donc on voit qu'il suffit de placer 0000 dans AX avant de quitter par le RET. Et en passant le RET on se retrouve apr�s le CALL 6631 qui lui en fait demande le mot de passe: CS=0E02 CS:492A C706AD2B5449 MOV WORD PTR [2BAD],4954 CS:4930 E8FE1C CALL 6631 ; Demande du mot de passe. CS:4933 E86100 CALL 4997 ; Comparaison de la chaine de caract�res CS:4936 0BC0 OR AX,AX ; Test ( 0000 ou FFFF dans AX du CALL ). CS:4938 7807 JS 4941 ; SAUT FATIDIQUE.... En suprimant le CALL de la demande du mot de passe ainsi que celui du test plus les deux instructions qui suivent on ne voit plus une seule trace de la demande du mot de passe en lan�ant le jeu. Et surtout, surtout on ne risque plus d'oublier que c'est la touche ESC qui valide le code tap� ! Avec PCTOOLS chercher E8FE1CE861000BC07807 dans le fichier VGA.DAT et remplacer le tout par des 90. FREDDY |